$datis = $sql->query('SELECT * FROM `users` WHERE username="'.$username.'"');
}
וגם
$datis = $sql->query('SELECT * FROM `users` WHERE id="'.$id.'"');
}
באותה מחלקה שיהיה אפשר לדוגמה בראשון לשים גם ID וגם username
וזה עדייין ימצא את המשתמש?
3 תשובות
א. בקונסטרקטור שלך לא אמורות להיות שום פעולות. לא שליפה מהדאטאבייס ולא שום דבר אחר. למעט בדיקת קלט והצבת משתנים. כל דבר אחר צריך לקרות במקומות אחרים, לא בקונסטרקטור.
ב. יעבירו אליך משתנה אחד, איך תדע לפיו עם זה יוזרניים או אידי? אתה יכול לבדוק אם המשתנה הוא מספר, אבל מה היוזרניים של מישהו הוא 123456 ? עם משתנה אחד אין לך דרך לדעת האם מה שמעבירים לך זה את האידי או את הניקניים. אתה יכול להחליט שאם מעבירים משתנה מסוג מחרוזת - זה יוזרניים אם לא, זה אידי וזה יראה ככה:
{
private $param;
private $sqlConnection;
private $dataFromDb;
public function __construct($param, $sqlConnection)
{
if(empty($param))
throw new \InvalidArgumentException("Search param cannot be empty");
if(null == $sqlConnection)
throw new \InvalidArgumentException("Db connection is null");
$this->param = $param;
$this->sqlConnection = $sqlConnection;
}
public function GetUserData()
{
return $this->GetData();
}
private function GetData()
{
if($this->dataFromDb == null)
{
if(is_int($this->param))
$query = "id=".intval($this->param);
else if(is_string($this->param))
$query = "username='".$this->sqlConnection->escape($this->param)."'";
else
throw new \Exception("Passed param is neither string nor int");
$this->dataFromDb = $this->sqlConnection->query("select .. from .. $query");
}
return $this->dataFromDb;
}
}
א. מבחינה טכנית: בגלל שיכול להיות שתיצור מחלקה ואף פעם לא תשתמש בה ואז סתם עשית פעולות מיותרות.
ב. מבחינה רעיונית: הוא לא מיועד בשביל זה. זה שאפשר לעשות את זה, לא אומר שצריך. בדיוק כמו שטויוטה רגילה לא מתאימה לנסיעות שטח, למרות שאפשר לעשות את זה. לצערי, יש הרבה דברים שאף אחד אף פעם לא מסביר בשום מקום, ולמה מיועד קונסטרקטור - זה אחד מהם.